# 语法错误-SyntaxError
# 含义：表示代码的语法不符合 Python 语言的规则。
# 产生原因：通常是在编写代码时出现了拼写错误、遗漏标点符号、使用错误的关键字等情况
# if True
#     print('hello')      # SyntaxError: expected ':'
if True:
    print('hello')

# 名称错误-NameError
# 含义：当尝试使用一个未定义的变量、函数、类等名称时会抛出此异常
# 产生原因：可能是忘记定义某个变量就直接使用，或者是变量名拼写错误导致找不到对应的定义
# print(a)    # NameError: name 'a' is not defined
a = 100
print(a)

# 类型错误-TypeError
# 含义：发生在对不同类型的数据进行不恰当的操作时，比如对字符串和数字进行加法运算（除非进行了特殊的类型转换）
# 产生原因：通常是由于数据类型不匹配，操作符应用于不适当的类型组合
x = '5'
y = 3
# print(x + y)    # TypeError: can only concatenate str (not "int") to str
x_int = int(x)
print(x_int + y)

# 索引错误-IndexError
# 含义：当尝试访问列表、元组、字符串等数据结构中不存在的索引时，就会抛出此异常
# 产生原因：通常是因为索引超出了数据结构的长度范围
a = [1, 2, 3]
# print(a[3]) # IndexError: list index out of range
print(a[1])

# 键错误-KeyError
# 含义：在使用字典时，如果尝试访问字典中不存在的键，就会抛出此异常。
# 产生原因：可能是拼写错误导致键名不对，或者是在没有正确添加键值对的情况下就去访问某个键
my_dict = {'name': 'cendy', 'age': 18}
# print(my_dict['city'])  # KeyError: 'city'
print(my_dict['name'])

# 值错误-ValueError
# 含义：当一个函数接收到一个不合适的值作为参数时会抛出此异常。例如，将一个不符合要求的字符串转换为数字，或者给一个函数提供了超出其允许范围的值。
# 产生原因：参数的值不符合函数的预期要求
# x = int('abc')
# print(x)    # ValueError: invalid literal for int() with base 10: 'abc'
m = '6'
print(f'm = {m}')

# 属性错误-AttributeError
# 含义：当尝试访问对象（如类实例）的属性或方法时，如果对象没有这个属性或方法，就会抛出此异常。
# 产生原因：可能是对象没有这个属性或方法，或者对象属性或方法被隐藏或删除了。
class Person:
    age = 18
person = Person()
# print(person.name)  # AttributeError: 'Person' object has no attribute 'name'
print(f'age = {person.age}')

# 输入输出错误-IOError
# 含义：在进行文件或其他输入输出操作时，如果出现问题，比如文件不存在、无法打开文件、没有读写权限等，就会抛出此异常。不过在 Python 3 中，IOError 已经被 OSError 取代，OSError 包含了更广泛的输入输出相关的错误情况。
# 产生原因：文件或其他输入输出相关的设备出现故障、权限问题、文件不存在等
# f = open('text10', 'r') # FileNotFoundError: [Errno 2] No such file or directory: 'text1'
